package br.com.srv.web.car;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.DynaValidatorForm;

import br.com.srv.componentes.veiculo.service.VeiculoService;
import br.com.srv.model.VeiculoTO;
import br.com.srv.security.SecurityPrincipal;
import br.com.srv.util.Util;
import br.com.srv.web.BaseAction;

public class CarAction extends BaseAction {
	
	private final String BLOQUEIO_PAGE_LOGIN = "bloqueio_login";
	private final String DESBLOQUEIO_PAGE_LOGIN = "desbloqueio_login";
	private final String PAGE_SUCESSO = "page_sucesso";

	public ActionForward goBloquear(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
		throws Exception {		
		
		preLogin(request);
		
		return mapping.findForward(BLOQUEIO_PAGE_LOGIN);
		
	}
	
	public ActionForward goDesbloquear(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
		throws Exception {
		
		preLogin(request);		
		
		return mapping.findForward(DESBLOQUEIO_PAGE_LOGIN);
		
	}
	
	public ActionForward bloquear(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
		throws Exception {		
		
		VeiculoTO veiculoTO = getVeiculoTO(form);
		
		if(!verificarLogin(request)) {
			request.setAttribute("mensagem", "Senha errada!");
			preLogin(request);
			return mapping.findForward(this.BLOQUEIO_PAGE_LOGIN);
		}
		
		VeiculoService veiculoService = (VeiculoService)getBeanSpring(VeiculoService.SERVICE_NAME);
		
		Integer usuarioResponsavelId = getPrincipal(request).getClienteId();
		
		boolean isOk = veiculoService.bloquearVeiculoById(usuarioResponsavelId, veiculoTO);
		
		if(!isOk) {
			request.setAttribute("mensagem", "Ocorreu algum erro na tentativa de transmitir o comando!");
			preLogin(request);
			return mapping.findForward(BLOQUEIO_PAGE_LOGIN);
		}
		
		return mapping.findForward(PAGE_SUCESSO);
		
	}
	
	public ActionForward desbloquear(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
		throws Exception {
		
		VeiculoTO veiculoTO = getVeiculoTO(form);
		
		if(!verificarLogin(request)) {
			request.setAttribute("mensagem", "Senha errada!");
			preLogin(request);
			return mapping.findForward(this.DESBLOQUEIO_PAGE_LOGIN);
		}
		
		VeiculoService veiculoService = (VeiculoService)getBeanSpring(VeiculoService.SERVICE_NAME);
		
		Integer usuarioResponsavelId = getPrincipal(request).getClienteId();
		
		boolean isOk = veiculoService.desbloquearVeiculoById(usuarioResponsavelId, veiculoTO);
		
		if(!isOk) {
			request.setAttribute("mensagem", "Ocorreu algum erro na tentativa de transmitir o comando!");
			preLogin(request);
			return mapping.findForward(DESBLOQUEIO_PAGE_LOGIN);
		}
		
		return mapping.findForward(PAGE_SUCESSO);
		
	}
	
	/*
	 * Prepara dados necess�rios para o login no request.
	 */
	private void preLogin(HttpServletRequest request) {
		SecurityPrincipal principal =
			(SecurityPrincipal) request.getUserPrincipal();				
		
		String veiculoId = request.getParameter("veiculoId");
		String descricao = principal.getDescVeiculo(veiculoId);
		
		request.setAttribute("veiculoId", veiculoId);
		request.setAttribute("descricao", descricao);
		request.setAttribute("login", principal.getName());
	}
	
	private boolean verificarLogin(HttpServletRequest request) {
		
		SecurityPrincipal principal =
			(SecurityPrincipal) request.getUserPrincipal();
		
		String password = Util.encrypt((String)request.getParameter("password"));				
		
		if (principal.getPassword().equals(password)) {
			return true;
		} else {
			return false;
		}
		
	}
	
	/*
	 * Passa os dados do form e condtr�i um VeiculoTO.
	 */
	@SuppressWarnings("unchecked")
	private VeiculoTO getVeiculoTO(ActionForm form) {
		DynaValidatorForm frm = (DynaValidatorForm) form;	
		Map<String, Object> params = frm.getMap();
		
		VeiculoTO veiculoTO = new VeiculoTO();
		veiculoTO.setDescricao((String)params.get("descricao"));
		veiculoTO.setId((Integer)params.get("veiculoId"));
		
		return veiculoTO;
	}
	
}
